package cn.com.zp.util.ftp;

import cn.com.zp.util.base.StringUtils;

import com.enterprisedt.net.ftp.FTPException; 
import com.enterprisedt.net.ftp.FileTransferClient; 
import com.enterprisedt.net.ftp.WriteMode; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

import java.io.File; 
import java.io.IOException; 
import java.text.ParseException; 

	/** 
	* FTP增强工具 
	* 
	*/ 
	public class UltraFTPClient extends FileTransferClient { 
	        private static Log log = LogFactory.getLog(UltraFTPClient.class); 

	        public UltraFTPClient() { 
	        } 

	        /** 
	         * 下载文件（夹）,在本地保持FTP上的目录结构 
	         * 
	         * @param localFolderPath 本地存放文件夹 
	         * @param remotePath            远程文件（夹）路径 
	         * @param remoteSubPath     远程文件存放相对根目录 
	         * @throws FTPException 
	         * @throws IOException 
	         */ 
	        public void ftpDownload(final String localFolderPath, final String remotePath, String remoteSubPath) throws FTPException, IOException, ParseException { 
	                if (isDir(remoteSubPath)) { 
	                        String localPath = localFolderPath + StringUtils.getRelativeRootPath(remoteSubPath, StringUtils.getParentPath(remotePath)); 
	                        if (!new File(localPath).exists()) 
	                                new File(localPath).mkdirs(); 
	                        String[] x = directoryNameList(remoteSubPath, false); 
	                        for (String fname : x) { 
	                                String rmFilePath =StringUtils.formatPath(remoteSubPath + "/" + fname); 
	                                if (isDir(rmFilePath)) { 
	                                        ftpDownload(localFolderPath, remotePath, rmFilePath); 
	                                } else { 
	                                        String _localPath = localFolderPath + "/" + 
	                                                        StringUtils.getRelativeRootPath(rmFilePath, StringUtils.getParentPath(remotePath)); 
//	                                        downloadFile(_localPath, rmFilePath, WriteMode.OVERWRITE); 
	                                        downloadFile(_localPath, rmFilePath); 
	                                } 
	                        } 
	                } else if (isFile(remotePath)) { 
	                        String localPath = localFolderPath + StringUtils.getRelativeRootPath(remoteSubPath, remotePath); 
//	                        downloadFile(localPath, remoteSubPath, WriteMode.OVERWRITE); 
	                        downloadFile(localPath, remoteSubPath); 
	                } else { 
	                        log.error("所下载的文件或文件夹不存在，请检查！"); 
	                } 
	                log.info("FTP下载从服务器上的" + remoteSubPath + "下载到本地" + localFolderPath + "结束！"); 
	        } 

	        /** 
	         * 上传文件（夹）,在FTP上保持本地的目录结构 
	         * 
	         * @param localFile         本地文件 
	         * @param localFilePath 本地文件的路径 
	         * @param remoteSubPath 远程文件存放相对根目录 
	         * @throws IOException 
	         * @throws FTPException 
	         */ 
	        public void ftpUpload(File localFile, final String localFilePath, final String remoteSubPath) throws IOException, FTPException { 
	                if (localFile.isDirectory()) { 
	                        for (File file : localFile.listFiles()) { 
	                                if (file.isDirectory()) { 
	                                        String remotePath = StringUtils.formatPath(remoteSubPath) + StringUtils.getRelativeRootPath(file.getPath(), StringUtils.getParentPath(localFilePath)); 
	                                        log.info(remotePath); 
	                                        if (!isExist(remotePath)) createDirectory(remotePath); 
	                                        ftpUpload(file, localFilePath, remoteSubPath); 
	                                } else { 
	                                        String remotePath = StringUtils.formatPath(remoteSubPath) + 
	                                                        StringUtils.getRelativeRootPath(file.getPath(), StringUtils.getParentPath(localFilePath)); 
	                                        uploadFile(file.getPath(), remotePath, WriteMode.APPEND); 
	                                } 
	                        } 
	                } else if (localFile.isFile()) { 
	                        String remotePath = StringUtils.formatPath(remoteSubPath) + 
	                                        StringUtils.getRelativeRootPath(localFile.getPath(), StringUtils.getParentPath(localFilePath)); 
	                        if (!isExist(StringUtils.getParentPath(remotePath))) 
	                                createDirectory(StringUtils.getParentPath(remotePath)); 
	                        System.out.println(remotePath); 
	                        uploadFile(localFile.getPath(), remotePath, WriteMode.APPEND); 
	                } 
	                log.info("FTP上传" + localFile.getPath() + "到" + remoteSubPath + "目录下结束！"); 
	        } 

	        /** 
	         * @param remotePath 远程文件（夹）路径 
	         * @return 远程的文件（夹）资源是否存在 
	         */ 
	        public boolean isExist(String remotePath) { 
	                boolean flag = true; 
	                try { 
	                        directoryList(remotePath); 
	                } catch (Exception e) { 
	                        flag = false; 
	                } 
	                return flag; 
	        } 

	        /** 
	         * @param remotePath 远程文件（夹）路径 
	         * @return 当远程资源存在且为文件时返回ture，否则返回false 
	         */ 

	        public boolean isFile(String remotePath) { 
	                try { 
	                        int size = directoryList(remotePath).length; 
	                        if (size >= 0) { 
	                                if (exists(remotePath)) { 
	                                        return true; 
	                                } 
	                        } 
	                } catch (Exception e) { 
	                } 
	                return false; 
	        } 

	        /** 
	         * @param remotePath 远程文件（夹）路径 
	         * @return 当远程资源存在且为文件夹时返回ture，否则返回false 
	         */ 
	        public boolean isDir(String remotePath) { 
	                try { 
	                        int size = directoryList(remotePath).length; 
	                        if (size >= 0) { 
	                                if (exists(remotePath)) { 
	                                        return false; 
	                                } else { 
	                                        return true; 
	                                } 
	                        } 
	                } catch (Exception e) { 
	                } 
	                return false; 
	        } 

	} 


